perm filename MOVE.N[V,VDS] blob sn#263337 filedate 1977-02-07 generic text, type T, neo UTF8
.TITLE MOVE

;THE FOLLOWING ROUTINES ARE CALLED THE "RUN-TIME" CODE AND ARE
;RESPONSIBLE FOR PERFORMING THE OPERATIONS OF THE MOTION INSTRUCTIONS.
;AT THE TIME THAT THESE SUBROUTINES ARE CALLED, IT IS ASSUMED THAT R1
;CONTAINS A POINTER TO THE MOTION STEP BEING EXECUTED AND R0 CONTAINS
;A POINTER TO THE NEXT SEQUENTIAL MOTION STEP.  EACH STEP IS STORED
;IN MEMORY IN THE FOLLOWING FORMAT:
;
;		|-----------------------|
;	R1→	| PTR TO NEXT STEP OR 0 |
;		|-----------------------|
;		| PTR TO FUNCTION BLK 	|
;		|-----------------------|
;		|   VARIBLE LENGTH      |
;		|                       |
;		|     DATA AREA         |
;		|-----------------------|
;
;AT THE COMPLETION OF THESE ROUTINES THE ARM STATUS WORD ( "ARMS" )
;CONTAINS FLAG BITS WHICH INDICATE ANY RUN-TIME ERRORS WHICH MIGHT
;HAVE OCCURRED.  IF A RUN-TIME ROUTINE RESULTED IN A REQUEST FOR A
;CHANGE IN THE MOTION INSTRUCTION EXECUTION SEQUENCE ( EG. A BRANCH 
;ON CONDITION ), THE NEXT STEP POINTER IN R0 WILL HAVE BEEN ADJUSTED
;TO THE ABSOLUTE ADDRESS OF OF NEXT STEP TO BE EXECUTED.

;REGISTERS USED:
;	R0,R1 PASS ARGUMENTS AND R1 MAY BE ALTERED
;	ALL OTHER REGISTERS ARE AVAILABLE FOR USE

;DEFINED GLOBALS

.GLOBL GO,GRASP,OPEN,FDRIVE,SPEED,COMNT,FTYPE,PAUSE
.GLOBL RIGHTY,LEFTY,BELOW,ABOVE,FLIP,NOFLIP
.GLOBL FSTOP,COARSE,INTOFF,INTON,PULSE

;REQUIRED GLOBALS

.GLOBL CONFIG,ABELOW,ABBL,FNOF,AFLIP,LOWTOL,MODES,NOINTG
.GLOBL TRNPTR,JANGLE,SOLVE,HAND,LHAND,FINAL,ARMS,CANPRO
.GLOBL HNDDNE,HNDBRK,MARG,USTOP,LSTOP,DRIVE,BADJTN,TYPERR
.GLOBL TYPSTR,EVAL,NSPEED,LINOUT,LFRT,ART,ONINTG,HITHND
.GLOBL NOSOL,NOTDAT,ARMDNE,ARMBRK,ANGLES,BADCLS,UHAND
.GLOBL PULTME,RELBRK,STPARM

;REGISTER DEFINITIONS

R0	=%0
R1	=%1
R2	=%2
R3	=%3
R4	=%4
R5	=%5
SG	=%5
SP	=%6
PC	=%7
;"GO"     - ARM MOTION IN SLEWING MODE

;THE GO MOTION INSTRUCTION PERFORMS A SLEWING MOTION FROM THE CURRENT
;POSITION OF THE ARM TO ANOTHER LOCATION AND ORIENTATION SPECIFIED BY
;A GIVEN TRANFORMATION.  ITS MOTION STEP VARIABLE STORAGE AREA LOOKS
;LIKE THIS:
;
;		|-----------------------|
;		| ADDR OF TRANS SYM BLK |
;		|-----------------------|
;
;NO PATH IS COMPUTED FOR THIS MOTION SO THE ARM IS FREE TO GO FROM
;POINT TO POINT IN WHAT EVER FASHION IT CHOOSES.

GO:	MOV	MARG(R1),R1	;TRANSFORM SYMBOL BLOCK
	MOV	TRNPTR(R1),R1	;TRANSFORM DATA?
	BEQ	GONOT
	MOV	R1,@#GOTRN	;SAVE TRANS POINTER
	MOV	#GOLST,R1	;"GO" SERVO DATA
	JSR	PC,DRIVE	;GO DRIVE THE ARM JOINTS
	BR	GODNE

GONOT:	MOV	#CANPRO,@#ARMS	;INDICATE ERROR, CAN PROCEED
	MOV	#NOTDAT,R1
	JSR	PC,TYPERR

GODNE:	RTS	PC


;SUBROUTINE TO COMPUTE JOINT ANGLES EVERY 20 MILLISECONDS

GOSUB:	BIS	#FINAL,16(R1)	;ONLY ONE PASS THRU THIS RTN
	MOV	@#GOTRN,R0	;CONVERT TRANS TO JOINT ANGLES
	MOV	@#CONFIG,R2	;ASSERT ANY REQUESTED CHANGES IN CONF
	CLR	@#CONFIG
	JSR	PC,SOLVE
	TST	R0		;VALID SOLUTION?
	BEQ	GOSDN		;YES
	BIS	#NOSOL,R0	;INDICATE INVALID SOLUTION
	MOVB	R0,@#ARMS
	BIS	#CANPRO,@#ARMS
GOSDN:	RTS	PC
	

;LOCAL STORAGE AREA

GOLST:	ARMDNE	;MASK BITS FOR ARM JOINTS
	625.	;ALLOW 6 SECONDS FOR ARM MOTION
	GOSUB	;32MSEC SUBROUTINE
	ARMBRK	;BRAKE BITS
	1	;FIRST JOINT TO BE SERVOED
	6	;TOTAL NUMBER OF JOINTS TO BE SERVOED

GOTRN:	0	;PTR TO GO TRANSFORM


;END OF "GO"
;"GRASP"  - CLOSES THE FINGERS AROUND AN OBJECT

;THE GRASP MOTION INSTRUCTION IS USED FOR CLOSING THE FINGERS AROUND
;OBJECTS.  THE FINGERS ARE COMMANDED TO CLOSE AND THE MOTION IS 
;TERMINATED AFTER A VERY BRIEF PERIOD.  IF THE HAND CLOSES
;FURTHER THAN A SPECIFIED DISTANCE AN ERROR MESSAGE IS SIGNALED.  ITS
;MOTION STEP VARIABLE STORAGE AREA LOOKS LIKE THIS:
;
;		|-----------------------|
;		|   SCALED DISTANCE     |
;		|-----------------------|

GRASP:	MOV	R0,-(SP)
	MOV	MARG(R1),R3	;MINIMUM HAND OPENING
	MOV	@#LHAND,@#HAND	;CLOSE THE HAND
	MOV	#GPLST,R1
	JSR	PC,DRIVE
	TST	@#ARMS  	;ANY ERRORS?
	BNE	GPDNE		;EXIT IF YES
      	MOV	#7,R0		;READ THE CURRENT HAND OPENING
	MOV	#1,R1
	JSR	PC,ANGLES
	BCS	GPERR		;BRANCH IF ADC ERROR
	CMP	R3,@#HAND	;HAND OPENING < MINIMUM EXPECTED?
	BLE	GPDNE		;NO ERROR IF GREATER THAN MINIMUM
	BIS	#CANPRO,@#ARMS	;ELSE ERROR
	MOV	#BADCLS,R1
GPERR:	JSR	PC,TYPERR
GPDNE:	MOV	(SP)+,R0
	RTS	PC


;SUBROUTINE TO COMPUTE HAND OPENING EVERY 20 MILLISECONDS

GPSUB:	MOV	R0,R3		;SAVE THE CURRENT SET PT TIME
	BIT	#HITHND,@#MODES	;HAND PULSE MODE ON?
	BEQ	NOPLSE		;NO
	CMP	@#PULTME,R0	;YES, TIME TO STOP PULSE?
	BGE	NOPLSE		;NO
	BIC	#HITHND,@#MODES	;YES
	MOV	@#MODES,R0
	BIS	#HNDBRK,R0
	JSR	PC,RELBRK
NOPLSE:	CMP	#40.,R3		;TIME TO STOP THE HAND MOTION?
	BGE	.+10		;NO
	BIS	#STPARM,@#ARMS	;YES
	RTS	PC
	

;LOCAL STORAGE AREA

GPLST:	HNDDNE	;MASK BITS FOR HAND IN RANGE
	500.	;ALLOW 5 SECONDS FOR HAND OPERATION
    	GPSUB	;16MSEC SUBROUTINE
	HNDBRK	;BRAKE BITS
	7	;FIRST JOINT TO BE SERVOED
	1	;TOTAL NUMBER OF JOINTS TO BE SERVOED



;END OF "GRASP" ROUTINES
;"OPEN"   - CHANGES HAND OPENING

;THE OPEN MOTION INSTRUCTION CHANGES THE HAND OPENING.  THIS ROUTINE
;REQUIRES AS ITS ONLY ARGUMENT THE DISTANCE THAT THE HAND IS TO BE
;LEFT OPEN.  NEGATIVE DISTANCES CLOSE THE FINGERS.  ITS MOTION STEP
;VARIABLE STORAGE AREA LOOKS LIKE THIS:
;
;		|-----------------------|
;		|   SCALED DISTANCE     |
;		|-----------------------|

OPEN:	MOV	MARG(R1),R1	;HAND OPENING
	CMP 	@#UHAND,R1	;GREATER THAN MAX?
	BGE	OPN1		;IN RANGE
	MOV	@#UHAND,R1	;ELSE SET EQUAL TO MAXIMUM
	BR	OPN2
OPN1: 	CMP	@#LHAND,R1	;LESS THAN MIN?
	BLE	OPN2
	MOV	@#LHAND,R1	;SET EQUAL TO MINIMUM
OPN2:	MOV	R1,@#HAND	;SET SET POINT
      	MOV	#OPLST,R1	;POINT TO SERVO DATA
	JSR	PC,DRIVE	;GO DRIVE THE HAND
       	RTS	PC


;SUBROUTINE TO COMPUTE HAND OPENING EVERY 20 MILLISECONDS

OPSUB:	BIT	#HITHND,@#MODES	;HAND PULSE MODE ON?
	BEQ	STPOPS		;NO
	CMP	@#PULTME,R0	;YES, TIME TO STOP PULSING?
	BGE	OPSDNE		;NO
	BIC	#HITHND,@#MODES	;YES
	MOV	@#MODES,R0
	BIS	#HNDBRK,R0
	JSR	PC,RELBRK
STPOPS:	BIS	#FINAL,16(R1)	;SIGNAL START CHECKING JOINT DONE
OPSDNE:	RTS	PC


;LOCAL STORAGE AREA

OPLST:	HNDDNE	;MASK BIT  FOR HAND       
	375.	;ALLOW 3 SECONDS FOR HAND OPERATION
	OPSUB	;16MSEC SUBROUTINE
	HNDBRK	;BRAKE BIT
	7	;FIRST JOINT TO BE SERVOED
	1	;TOTAL NUMBER OF JOINTS TO BE SERVOED


;END OF "OPEN" ROUTINES
;"DRIVE"  - SINGLE JOINT MOTION

;THE DRIVE MOTION INSTRUCTION IS USED TO DRIVE A SINGLE JOINT OF THE
;ARM.  IT REQUIRES THREE ARGUMENTS: THE JOINT TO BE DRIVEN(1-7), THE
;TOTAL CHANGE IN JOINT ANGLE TO PERFORM ( OR HAND OPENING ), AND THE
;TOTAL TIME THE OPERATION IS TO TAKE.  ITS MOTION STEP VARIABLE
;STORAGE AREA LOOKS LIKE THIS:
;
;		|-----------------------|
;		|  JOINT NUMBER (1-7)   |
;		|-----------------------|
;		| CHANGE IN JT ANG(DEG) |
;		|-----------------------|
;		|      CLOCK TICKS      |
;		|-----------------------|


FDRIVE:	ADD	#MARG,R1	;PTR TO ARGUMENTS
	MOV	(R1)+,R2     	;JOINT NUMBER
	BLE	BADJT		;MUST BE IN RANGE
	CMP	#7,R2
	BLT	BADJT
	MOV	R2,@#FDRVJT	;SET JOINT TO BE DRIVEN
	DEC	R2		;COMPUTE THE BRAKE BIT MASK
	MOV	#1,R3
	ASH	R2,R3
	MOV	R3,@#FDRVBK	;SAVE THE BRAKE BIT
	SWAB	R3		;GET THE IN RANGE BIT MASK
	MOV	R3,@#FDRVLT	;SAVE IN RANGE MASK BIT
	ASL	R2		;GET JOINT WORD INDEX
	MOV	R2,@#FWINDX	;SAVE INDEX
	MOV	(R1)+,R3	;GET THE CHANGE IN JOINT ANGLE
	CMP	#7,@#FDRVJT	;IF HAND, CONVERT NUMBER TO DISTANCE
	BNE	CHKCHG
	MOV	R3,R4		;SAVE SIGN
	BPL	.+4
	NEG	R4
	MUL	#45.,R4
	ASHC	#-2,R4
	TST	R4		;OVERFLOW?
	BEQ	.+6
	MOV	USTOP(R2),R5	;YES USE MAXIMUM HAND OPENING
	TST	R3		;ATTACH SIGN
	BPL	.+4
	NEG	R5
	MOV	R5,R3
CHKCHG:	ADD	JANGLE(R2),R3	;CHECK IF GOING BEYOND STOP LIMITS
	BVC	NOOVER
	MOV	#100000,R3	;OVERFLOW, SET TO EXTREME ANGLE
	TST	JANGLE(R2)
	BMI	.+6
	MOV	#77777,R3
NOOVER:	CMP	LSTOP(R2),R3	;LESS THAN LOWER?
	BLE	FDRV1
	MOV	LSTOP(R2),R3	;USE LOWER LIMIT
	BR	FDRV2
FDRV1:	CMP	USTOP(R2),R3	;MORE THAN UPPER LIMIT?
	BGE	FDRV2
	MOV	USTOP(R2),R3	;USE UPPER LIMIT
FDRV2:	MOV	R3,@#FTH	;SAVE FINAL JOINT ANGLE
	SUB	JANGLE(R2),R3	;SAVE TOTAL CHANGE
	MOV	R3,@#DTH
	MOV	(R1)+,R2	;GET DURATION FOR MOTION
	BGT	.+6
	MOV	#1,R2		;DEFAULT = 1 TICK
	MOV	R2,@#TIME1	;SAVE IT
	ADD	#375.,R2	;ALLOW 3 SECONDS TO NULL ERROR
	BVC	.+6		;CHECK FOR OVERFLOW
	MOV	#77777,R2	;REPLACE WITH MAXIMUM PERMITED TIME
	MOV	R2,@#FDRVTM	;SAVE TOTAL TIME FOR MOTION
	MOV	#FDRVLT,R1	;PERFORM MOTION
	JSR	PC,DRIVE
	BR	FDRDNE

BADJT:	MOV	#BADJTN,R1	;INDICATE SPECIFICATION ERROR
	JSR	PC,TYPERR
	BIS	#CANPRO,@#ARMS

FDRDNE:	RTS	PC


;SUBROUTINE TO COMPUTE JOINT ANGLES EVERY 20 MILLISECONDS

FDRVSB:	MOV	R1,R5		;SAVE PTR TO JOINT ANGLES
	MOV	@#TIME1,R2	;EVALUATE PERCENT CHANGE IN SET POINT
	JSR	PC,EVAL
	MUL 	@#DTH,R0	;x CHANGE IN JOINT ANGLE
	ASHC	#2,R0
	ADD 	@#FTH,R0 	;+ FINAL SET POINT
	ADD	@#FWINDX,R5	;PTR TO JOINT ANGLE SET POINT
	MOV	R0,(R5)		;SAVE NEW SET POINT
	RTS	PC


;LOCAL STORAGE AREA

FDRVLT:	0       ;MASK BITS FOR ARM JOINT DONE BIT
FDRVTM:	0    	;TIME ALLOWED FOR MOTION
	FDRVSB	;SUBROUTINE TO EVALUATE POLYNOMIAL EACH 10 MSEC.
FDRVBK: 0     	;BRAKE BIT 
FDRVJT:	0	;NUMBER OF JOINT TO BE SERVOED
	1	;TOTAL NUMBER OF JOINTS TO BE SERVOED

FWINDX:	0	;WORD INDEX INTO JANGLE TABLE
TIME1:	0	;DURATION OF MOTION
DTH:	0	;CHANGE IN JOINT ANGLE
FTH:	0	;FINAL JOINT ANGLE

;END OF "DRIVE"
;"SPEED"  - CHANGES THE SPEED AT WHICH MOTIONS ARE PERFORMED

;THE SPEED INSTRUCTION IS USED FOR SPECIFYING THE SPEED AT WHICH
;THE NEXT ARM MOTION IS TO BE PERFORMED.  THE SPEED IS EXPRESSED
;AS A PERCENTAGE RANGING FROM 1 (VERY SLOW) TO 32678.( AS FAST
;AS THE HARDWARE SERVO CAN GO).  THE NORMAL OPERATING SPEED IS
;SET TO 100.  THE MOTION STEP VARIABLE STORAGE AREA FOR THIS
;INSTRUCTION IS AS FOLLOWS:
;
;		|-----------------------|
;		|   INTEGER PERCENTAGE  |
;		|-----------------------|

SPEED:	MOV	MARG(R1),R1	;% SPEED
	CMP	#1,R1		;IF SPEED ≤ 1% USE MINIMUM SPEED
	BGE	USEMIN
	CLR	R2		;NORMAL SPEED IS 100
	MOV	#144000,R3
	DIV	R1,R2		;FRACTIONAL CHANGE
	BR	.+6
USEMIN:	MOV	#77777,R2	;USE MINIMUM SPEED
	MOV	R2,@#NSPEED	;SAVE FOR "TIMER" ROUTINE
	RTS	PC

;END OF "SPEED"
;"PAUSE","TYPE","COMMNT"

;THE FOLLOWING MOTION INSTRUCTIONS TAKE AS THEIR ONLY ARGUMENT A
;STRING.  THE STRINGS ARE STORED IN THE STEP VARIABLE AS FOLLOWS:
;
;		|-----------------------|
;		| 2ND CHAR  |  1ST CHAR |
;		|-----------------------|
;		|           :           |
;		|-----------------------|
;		|     0     | LAST CHAR	|
;		|-----------------------|
;
;A ZERO BYTE IS USED TO MARK THE END OF THE STRING.

;"COMMNT" - DOESN'T DO ANYTHING, NO OPERATION

COMNT: 	RTS	PC


;"TYPE" - TYPES OUT MESSAGE STRING

FTYPE:	MOV	R1,SG
	ADD	#MARG,SG
	JSR	PC,LINOUT
	RTS	PC


;"PAUSE" - TYPES OUT MESSAGE AND HALTS USER PROGRAM EXECUTION

PAUSE:	MOV	R1,SG   	;GET POINTER TO MESSAGE STRING
	ADD	#MARG,SG
	JSR	PC,TYPSTR	;TYPE MESSAGE
	MOV	#PASC1,SG	;TYPE CRLF AND "PAUSE"
	JSR	PC,TYPSTR
	MOV	#CANPRO,@#ARMS	;INDICATE STOP EXECUTION, CAN PROCEED
	RTS	PC

PASC1:	.BYTE	15,12
       	.ASCII	/PAUSE:  /
	.BYTE	0
	.EVEN

;END OF "PAUSE","TYPE","COMMNT"
;"FLIP","NOFLIP","ABOVE","BELOW","RIGHTY","LEFTY"

;THE FOLLOWING INSTRUCTIONS ARE FOR ASSERTING THAT THE CONFIGURATION
;OF THE ARM IS TO BE CHANGED DURING THE NEXT ARM MOTION THAT IS NOT A
;"MOVE".  NONE OF THESE INSTRUCTIONS HAVE VARIABLE STOP AREAS.

;"RIGHTY/LEFTY" - RIGHT OR LEFT ARM CONFIGURATION

RIGHTY:	BIS	#LFRT,@#CONFIG
	BIS	#ART,@#CONFIG
	RTS	PC

LEFTY:	BIC	#ART,@#CONFIG
	BIS	#LFRT,@#CONFIG
	RTS	PC

;"ABOVE/BELOW" - APPROACH OBJECTS FROM ABOVE OR BELOW

BELOW:	BIS	#ABBL,@#CONFIG
	BIS	#ABELOW,@#CONFIG
	RTS	PC

ABOVE:	BIC	#ABELOW,@#CONFIG
	BIS	#ABBL,@#CONFIG
	RTS	PC

;"NOFLIP/FLIP" - FLIP OUTER JOINTS, MAKES THETA 5 POSITIVE/NEGATIVE

FLIP:	BIS	#FNOF,@#CONFIG
	BIS	#AFLIP,@#CONFIG
	RTS	PC

NOFLIP:	BIC	#AFLIP,@#CONFIG
	BIS	@#FNOF,@#CONFIG
	RTS	PC

;"STOP","COARSE","INTOFF","INTON","PULSE"

;THE FOLLOWING MOTION INSTRUCTIONS DO NOT TAKE ANY ARGUMENTS AND AS
;SUCH THEY DO NOT HAVE A VARIABLE STORAGE AREA IN THEIR MOTION STEP
;BLOCKS.

;"STOP" - MARKS THE END OF A PASS THROUGH A PROGRAM

FSTOP:	CLR	R0		;TERMINATE WITH NEXT STEP
	RTS	PC


;"COARSE" - SETS LOW TOLERANCE MODE FOR SIGNALING JOINTS IN RANGE

COARSE:	BIS	#LOWTOL,@#MODES
	RTS	PC


;"INTOFF" - SETS MODE TO TURN OFF HARDWARE INTEGRATION FEATURE

INTOFF:	BIS	#NOINTG,@#MODES
	RTS	PC


;"INTON" - SETS MODE TO FORCE HARDWARE INTEGRATION ON ALL OF THE TIME

INTON: 	BIS	#ONINTG,@#MODES
	RTS	PC

;"PULSE" - SETS MODE FOR HARDWARE PULSING OF HAND FOR A FEW MSEC

PULSE:	BIS	#HITHND,@#MODES
	RTS	PC

;END OF RUN-TIME ROUTINES

.END